package JFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class GobangPanel extends JPanel implements MouseListener {
    int qx = 20, qy = 40, qw = 490, qh = 490;//棋盘位置、宽高
    int bw = 150, bh = 50, bx = 570, by = 150;//一系列的按钮宽高、位置

    int x,y; //当前的落子 ，用来判断
    int [][] SaveGame =new int[16][16];//(SaveGame[i][j] == 1)

    int qc = 1;//记录白棋=2，黑棋=1
    int qn = 0;//判断棋子是否重复

    String go = "黑子先行";//游戏信息
    boolean canplay = true;//判断游戏是否开始和结束

    public GobangPanel() {
        init();

        this.setFocusable(true);//获得焦点事件
        this.addMouseListener(this);//获得鼠标监听事件

    }
    public void init() {
        //遍历并初始化数组
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                SaveGame[i][j] = 0;
            }
        }
        qc =1;//黑子先行
    }

    @Override
    public void paint(Graphics g) {
        //背景
        Data.back2.paintIcon(this,g,0,0);
        //棋盘
        g.setColor(new Color(173, 167, 159));
        g.fillRect(qx, qy, qw, qh);

        //棋盘线
        g.setColor(Color.black);
        for (int x = 0; x <= qw; x += 35) {
            g.drawLine(qx, x + qy, qw + qx, x + qy);//绘制一条横线

            g.drawLine(x + qx, qy, x + qx, qh + qy);//绘制一条竖线
        }
        //棋盘标注点
        for (int i = 3; i <= 11; i += 4) {
            for (int y = 3; y <= 11; y += 4) {
                g.fillOval(35 * i + qx - 3, 35 * y + qy - 3, 6, 6);//绘制实心圆 每格35px
            }
        }
        //信息：
        g.setColor(new Color(110, 110, 148));

        g.fillRect(qx+qw+20, qy, 300, qh); //信息栏
        g.drawString("",qx+qw+20,qy+20);

        g.setColor(Color.WHITE);//设置画笔颜色
        g.fillRect(bx, by, bw, bh);//绘制开始按钮
        g.setFont(new Font("华文行楷", 10, 30));//设置字体
        g.setColor(Color.black);//设置画笔颜色
        g.drawString("开始", 615, 185);//绘制字符

        //悔棋按钮
        g.setColor(Color.LIGHT_GRAY);//设置画笔颜色
        g.fillRect(bx, by + 60, bw, bh);//绘制悔棋按钮
        g.setFont(new Font("华文行楷", 10, 30));//设置字体
        g.setColor(Color.WHITE);//设置画笔颜色
        g.drawString("悔棋", 615, 245);//绘制字符

        //认输按钮
        g.setColor(Color.GRAY);//设置画笔颜色
        g.fillRect(bx, by + 120, bw, bh);//绘制认输按钮
        g.setFont(new Font("华文行楷", 10, 30));//设置字体
        g.setColor(Color.WHITE);//设置画笔颜色
        g.drawString("认输", 615, 305);//绘制字符

        //提示信息
        g.setColor(Color.blue);//设置画笔颜色
        g.drawString(go, 615, 375);//绘制字符
        g.setColor(new Color(53, 73, 23));//设置画笔颜色
        g.drawString("Dong的五子棋", 555, 100);//绘制字符

        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                if (SaveGame[i][j] == 1)//黑子
                {
                    int sx = i * 35 + qx;
                    int sy = j * 35 + qy;
                    g.setColor(Color.BLACK);
                    g.fillOval(sx - 13, sy - 13, 26, 26);//绘制实心圆
                }
                if (SaveGame[i][j] == 2)//白子
                {
                    int sx = i * 35 + qx;
                    int sy = j * 35 + qy;
                    g.setColor(Color.WHITE);
                    g.fillOval(sx - 13, sy - 13, 26, 26);//绘制实心圆
                    g.setColor(Color.BLACK);
                    g.drawOval(sx - 13, sy - 13, 26, 26);//绘制空心圆
                }
            }
        }
    }
    //判断输赢
    private boolean WinLose() {
        boolean flag = false;//输赢
        int count = 1;//相连数
        int color = SaveGame[x][y];//记录棋子颜色

        //判断横向棋子是否相连
        int i = 1;//迭代数
        while (color == SaveGame[x + i][y]) {
            count++;
            i++;
        }
        i = 1;//迭代数
        while (color == SaveGame[x - i][y]) {
            count++;
            i++;
        }
        if (count >= 5) {
            flag = true;
        }

        //判断纵向棋子是否相连
        count = 1;
        i = 1;//迭代数
        while (color == SaveGame[x][y + i]) {
            count++;
            i++;
        }
        i = 1;//迭代数
        while (color == SaveGame[x][y - i]) {
            count++;
            i++;
        }
        if (count >= 5) {
            flag = true;
        }

        //判断斜向棋子是否相连（左上右下）
        count = 1;
        i = 1;//迭代数
        while (color == SaveGame[x - i][y - i]) {
            count++;
            i++;
        }
        i = 1;//迭代数
        while (color == SaveGame[x + i][y + i]) {
            count++;
            i++;
        }
        if (count >= 5) {
            flag = true;
        }

        //判断斜向棋子是否相连（左下右上）
        count = 1;
        i = 1;//迭代数
        while (color == SaveGame[x + i][y - i]) {
            count++;
            i++;
        }
        i = 1;//迭代数
        while (color == SaveGame[x - i][y + i]) {
            count++;
            i++;
        }
        if (count >= 5) {
            flag = true;
        }

        return flag;
    }


    @Override
    public void mouseClicked(MouseEvent e) {

    }
    //鼠标按下
    @Override
    public void mousePressed(MouseEvent e) {

        x=e.getX();
        y=e.getY();

        if (canplay == true) {
            if (x > qx && x < qx + qw && y > qy && y < qy + qh) {
                //计算点击位置最近的点
                if ((x - qx) % 35 > 17) {
                    x = (x - qx) / 35 + 1;
                } else {
                    x = (x - qx) / 35;
                }
                if ((y - qy) % 35 > 17) {
                    y = (y - qy) / 35 + 1;
                } else {
                    y = (y - qy) / 35;
                }


                //判断当前位置有没有棋子
                if (SaveGame[x][y] == 0) {
                    SaveGame[x][y] = qc; //没有棋 就放进去
                    qn = 0;               //qn=0 表示一方已经下好了
                } else {
                    qn = 1;         //qn=0 表示一方还没有下好了
                }

                //切换棋子
                if (qn == 0) {
                    if (qc == 1) {
                        qc = 2;
                        go = "轮到白子";
                    } else {
                        qc = 1;
                        go = "轮到黑子";
                    }
                }
                this.repaint();//重新执行一次paint方法
                boolean wl = this.WinLose();
                if (wl) {
                    JOptionPane.showMessageDialog(this, "游戏结束，" + (SaveGame[x][y] == 1 ? "黑方赢了" : "白方赢了"));//弹出提示对话框
                    canplay = false;
                }

            }
        }
        //通过计算 判断按下了上面按钮

        //开始按钮
        if (x > bx && x < bx + bw && y > by && y < by + bh) {
            //判断游戏是否开始
            if (canplay == false) {
                //如果游戏结束，则开始游戏
                canplay = true;
                JOptionPane.showMessageDialog(this, "游戏开始");
                //初始化游戏
                init();

                this.repaint();//重新执行一次paint方法

            } else {
                //如果游戏进行中，则重新开始
                JOptionPane.showMessageDialog(this, "重新开始");
                //初始化游戏
                init();

                this.repaint();//重新执行一次paint方法

            }
        }

        //认输按钮
        if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 120 && e.getY() < by + 120 + bh) {
            //判断游戏是否开始
            if (canplay) {
                //判断是谁认输
                if (qc == 1) {
                    JOptionPane.showMessageDialog(this, "黑方认输，白方获胜");
                    canplay = false;
                } else if (qc == 2) {
                    JOptionPane.showMessageDialog(this, "白方认输，黑方获胜");
                    canplay = false;
                }
            } else {
                JOptionPane.showMessageDialog(this, "请先开始游戏");
            }

        }
        //实现悔棋按钮
        //判断是否点击悔棋按钮
        if (e.getX() > bx && e.getX() < bx + bw && e.getY() > by + 60 && e.getY() < by + 60 + bh) {
            //判断游戏是否开始
            if (canplay == true) {
                //遍历棋盘上是否有棋子
                int z = 0;
                for (int i = 0; i < 15; i++) {
                    for (int j = 0; j < 15; j++) {
                        if (SaveGame[i][j] != 0) {
                            z++;
                        }
                    }
                }
                //判断是否有棋子
                if (z != 0) {
                    JOptionPane.showMessageDialog(this, "下棋亦如人生，你走的每一步都没有回头路。");
                } else {
                    JOptionPane.showMessageDialog(this, "棋盘上已无棋子");
                }

            } else {
                JOptionPane.showMessageDialog(this, "请先开始游戏");
            }
        }
    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}
